﻿Partial Public Class Mailer
    Inherits ServiceProcess.ServiceBase

    Private comm As ClsCommunicate
    'Private cnt As Long = 0
    Private flgStop As Integer = -1
    Private isStartErr As Boolean = False
    Private intTimeout As Integer = 0

    ''' <summary>
    ''' サービス開始
    ''' </summary>
    Protected Overrides Sub OnStart(ByVal args() As String)
        ' サービスを開始するコードをここに追加します。このメソッドによって、
        ' サービスが正しく実行されるようになります
        Try
            isStartErr = False
            comm = New ClsCommunicate

            '■イベントログ出力（出力メッセージ内容【メーラーサービス開始】）
            comm.WriteToEventLog(ClsStatic.MSG_EVENTLOG.SERVICES_START, ClsStatic.EventID.SuccessAudit)
            If comm.init() = False Then
                isStartErr = True
                'メーラーサービス停止
                Throw New ApplicationException
            End If

            Dim threadSleep As New System.Threading.Thread(AddressOf loopSleepEvent)
            threadSleep.Start()

            'Dim t As New System.Timers.Timer()
            ''
            't.Interval = 5000

            'AddHandler t.Elapsed, New System.Timers.ElapsedEventHandler(AddressOf loopSleepEvent)
            ''時間があったら、定時実行処理を行う    
            't.AutoReset = False
            ''一回だけ実行するか（false）ずっと実行するか(true)；    
            't.Enabled = True
            ''System.Timers.Timer.Elapsedを実行すうか  
        Catch ex As ApplicationException
            flgStop = 0
            Me.Stop()
            SystemError.SystemLog("初期化失敗のため、サービス停止された")
        Catch ex As Exception
            flgStop = 0
            Me.Stop()
            SystemError.SystemLog("初期化失敗のため、サービス停止された")
        End Try
    End Sub

    ''' <summary>
    ''' サービス停止
    ''' </summary>
    ''' <remarks></remarks>
    Protected Overrides Sub OnStop()
        ' サービスを停止するのに必要な終了処理を実行するコードをここに追加します。

        Try
            flgStop = 1
            stopSleepEvent()

            If comm.pop3Client.Connected Then
                '通信終了処理
                'comm.pop3Client.Disconnect()
                comm.pop3Client.Dispose()
            End If

        Catch ex As ApplicationException
            Me.Stop()
            SystemError.SystemLog("サービス停止失敗のため、サービス停止された")
        Catch ex As Exception
            Me.Stop()
            SystemError.SystemLog("サービス停止失敗のため、サービス停止された")
        Finally
            comm.WriteToEventLog(ClsStatic.MSG_EVENTLOG.SERVICES_STOP, ClsStatic.EventID.SuccessAudit)
            comm = Nothing
        End Try
    End Sub


    ''' <summary>
    ''' スリープイベント処理
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub loopSleepEvent()
        Try
            '↓ ADD AT 2014/01/23 BY SHIN (障害対応：スタックオーバーフロー)
            Do
                '↑ ADD AT 2014/01/23 BY SHIN (障害対応：スタックオーバーフロー)

                'メールのチェック回数
                'cnt += 1
                ''メール件数初期化
                'comm.cntMail = 0
                If comm.mainMailer() = False Then
                    isStartErr = True
                    'メーラーサービス停止
                    Throw New ApplicationException
                    Exit Do
                End If
                'Console.WriteLine(System.DateTime.Now.ToString("yyy-MM-dd HH:mm:ss    ") & cnt & "回目：　" & comm.cntMail & "通メールを検出")

                If flgStop = 1 Then
                    flgStop = 0
                    Exit Do
                End If

                System.Threading.Thread.Sleep(Integer.Parse(InitSettings.Instance.Interval))

                '↓ UPD AT 2014/01/23 BY SHIN (障害対応：スタックオーバーフロー)
                'loopSleepEvent()
            Loop Until 0 = 1
            '↑ UPD AT 2014/01/23 BY SHIN (障害対応：スタックオーバーフロー)

        Catch ex As ApplicationException
            flgStop = 0
            Me.Stop()
            SystemError.SystemLog("処理失敗のため、サービス停止された")
        Catch ex As Exception
            flgStop = 0
            Me.Stop()
            SystemError.SystemLog("処理失敗のため、サービス停止された")
        End Try
    End Sub

    ''' <summary>
    ''' スリープイベント処理
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub stopSleepEvent()
        Try
            If intTimeout >= 180 OrElse isStartErr = True Then
                intTimeout = 0
                Exit Sub
            End If
            System.Threading.Thread.Sleep(1000)
            If flgStop = 0 Then
                Exit Sub
            Else
                stopSleepEvent()
            End If
            intTimeout += 1

        Catch ex As ApplicationException
            Me.Stop()
            SystemError.SystemLog("サービス停止失敗のため、サービス停止された")
        Catch ex As Exception
            Me.Stop()
            SystemError.SystemLog("サービス停止失敗のため、サービス停止された")
        End Try
    End Sub

End Class
